package process

import (
	"chat-cli/message"
	"chat-cli/utils"
	"encoding/json"
	"fmt"
	"log"
	"net"
)

//显示菜单，保持跟服务端通讯

//显示登录成功后的界面  并提供交互给用户的操作
func ShowMenu() {
	fmt.Println("--------------菜单------------------")
	fmt.Println("---------1.显示在线用户列表------------")
	fmt.Println("---------2.群发消息--------------------")
	fmt.Println("---------3.私发消息--------------------")
	fmt.Println("---------4.信息列表-------------------")
	fmt.Println("---------5.退出系统--------------------")
	fmt.Println("请选择1--4：")
	var key int
	var content string
	var sendMesUserId int
	//因为我们总要使用 smsProcess 实例  所以将其定义在switch外部
	//这里分别启动私聊 和群聊的实例 方便直接进行操作
	smsProcess := &SmsProcess{}
	PmsProcess := &PmsProcess{}
	fmt.Scanf("%d \n", &key)
	switch key {
	case 1:
		outputUserList()
	case 2:
		fmt.Println("请输入群发内容：")
		fmt.Scanf("%s\n", &content)
		fmt.Println(content)
		smsProcess.SendGroupMes(content)
	case 3:
		fmt.Println("请输入接收用户id：")
		fmt.Scanf("%d \n", &sendMesUserId)
		fmt.Println("请输入消息内容:")
		fmt.Scanf("%s\n", &content)
		PmsProcess.SendPrivateMes()
	case 4:
		fmt.Println("信息列表")
	case 5:
		log.Panic("你退出了系统")
		//panic("system exit") //defer 不会执行  小心
	default:
		fmt.Println("输入错误，请重新输入..")
	}
}

//和服务器保持通讯
func ProcessServerMes(Conn net.Conn) {
	//创建一个transfer实例，不停的读取服务器发送的消息
	tf := &utils.Transfer{
		Conn: Conn,
	}
	for {
		mes, err := tf.ReadPkg()
		if err != nil {
			log.Println("获取服务端的数据异常 ： err=", err)
			return
		}
		//如果读取到数据  进一步的逻辑处理
		//这里处理的就是来自服务器的消息
		switch mes.Type {
		case message.NotifyUserStatusMesType: //有人上线了
			//1.取出数据包内的数据
			//2. 把这个用户的状态信息 保存到客户端内维护的map中去 map[int]user
			var notifyUserStatusMes message.NotifyUserStatusMes
			err = json.Unmarshal([]byte(mes.Data), &notifyUserStatusMes)
			if err != nil {
				fmt.Println("获取用户列表信息 server 解包 异常 ")
			}
			//接受信息后对列表进行维护
			updateUserStatus(&notifyUserStatusMes)
		case message.SmsMesType: //接受群发消息的逻辑
			outputGroupMes(&mes)
		case message.PrivateMesType:
			OutputPrivateMes(&mes)
		default:
			fmt.Println("返回未知消息类型！")
		}
	}
}
